package tsing.good_simple.lock_impl;

import cn.hutool.core.util.IdUtil;
import tsing.good_simple.goodutil.RedisUtil;
import tsing.javase.excption.BusinessException;
import tsing.javase.redis.RedissonUtil;

import java.util.Random;
import java.util.concurrent.TimeUnit;

/**
 * @Date 2024/11/25 13:57
 * @Author Tsing
 * 分布式锁的实现
 * 分布式锁可以通过：
 * 1.Redisson实现
 * 2.redis实现
 *
 */
public class DistributeLockImpl {


    public void coreMethod(){
        System.out.println("do something");
    }

    /**
     * 使用Redisson  设置分布式锁
     * @param key
     */
    public void useRedissonLockMethod(String key){
        boolean lock = RedissonUtil.getLock(key,1, TimeUnit.MINUTES);
        if(!lock){
            // 未获得锁
            return;
        }
        try {
            coreMethod();
        } finally {
            RedissonUtil.unlock(key);
        }

    }


    /**
     * 使用redis 来实现分布式锁
     * @param key
     */
    public void useRedisLockMethod(String key) {
        // 生成一个UUID
        String UUID = IdUtil.fastUUID();

        // 2.使用set命令获取锁
        boolean lockFlag = RedisUtil.setIfAbsent(key, UUID, 1, TimeUnit.MINUTES);
        // 如果失败，说明存在
        if (!lockFlag) {
            return;
        }
        try {
            coreMethod();
        } finally {

            // final:判断是否为自己的锁，然后释放锁；
            if (UUID.equals(RedisUtil.getCacheObject(key))) {
                RedisUtil.deleteObject(key);
            }

        }

    }


}
